package com.happy.unitconvert.service;

import com.happy.unitconvert.model.dto.ExchangeRateResponse;
import reactor.core.publisher.Mono;

import java.math.BigDecimal;
import java.util.Map;

/**
 * 汇率缓存服务接口
 * 负责汇率数据的缓存管理
 *
 * @author Happy
 */
public interface ExchangeRateCacheService {

  /**
   * 缓存汇率数据
   *
   * @param baseCurrency 基础货币代码
   * @param rates        汇率数据
   * @return 缓存完成信号
   */
  Mono<Void> cacheExchangeRates(String baseCurrency, Map<String, BigDecimal> rates);

  /**
   * 从缓存获取汇率数据
   *
   * @param baseCurrency 基础货币代码
   * @return 缓存的汇率数据，如果不存在则返回空
   */
  Mono<Map<String, BigDecimal>> getCachedExchangeRates(String baseCurrency);

  /**
   * 获取特定货币对的汇率
   *
   * @param fromCurrency 源货币代码
   * @param toCurrency   目标货币代码
   * @return 汇率值，如果不存在则返回空
   */
  Mono<BigDecimal> getCachedExchangeRate(String fromCurrency, String toCurrency);

  /**
   * 检查缓存是否存在且有效
   *
   * @param baseCurrency 基础货币代码
   * @return true 如果缓存存在且有效，false 如果不存在或已过期
   */
  Mono<Boolean> isCacheValid(String baseCurrency);

  /**
   * 清除指定基础货币的缓存
   *
   * @param baseCurrency 基础货币代码，如果为null则清除所有缓存
   * @return 清除完成信号
   */
  Mono<Void> clearCache(String baseCurrency);

  /**
   * 缓存完整的汇率响应数据
   *
   * @param baseCurrency 基础货币代码
   * @param response     汇率响应数据
   * @return 缓存完成信号
   */
  Mono<Void> cacheExchangeRateResponse(String baseCurrency, ExchangeRateResponse response);

  /**
   * 从缓存获取完整的汇率响应数据
   *
   * @param baseCurrency 基础货币代码
   * @return 缓存的汇率响应数据，如果不存在则返回空
   */
  Mono<ExchangeRateResponse> getCachedExchangeRateResponse(String baseCurrency);

  /**
   * 获取缓存键的剩余过期时间（秒）
   *
   * @param baseCurrency 基础货币代码
   * @return 剩余过期时间，-1表示永不过期，-2表示键不存在
   */
  Mono<Long> getCacheExpiration(String baseCurrency);

  /**
   * 设置缓存过期时间
   *
   * @param baseCurrency  基础货币代码
   * @param expireSeconds 过期时间（秒）
   * @return 设置完成信号
   */
  Mono<Boolean> setCacheExpiration(String baseCurrency, long expireSeconds);
}
